//路由鉴权：判断用户是否有权限访问该路由
// 权限控制主要是通过路由守卫实现的，在路由跳转前，会先调用该路由对应的守卫函数，如果该函数返回 true，则可以访问该路由，否则会跳转到 403 页面。
// 这里我们使用一个简单的例子，判断当前用户是否有权限访问该路由。
// 首先，在路由配置中，为该路由添加 meta 属性，如：
// {
//   path: '/example',
//   name: 'example',
//   component: () => import('@/views/Example'),
//   meta: {
//     roles: ['admin', 'user'] // 该路由需要的角色
//   }
// }
// 然后，在路由守卫中，判断当前用户是否有权限访问该路由：
// router.beforeEach((to, from, next) => {
//   // 判断当前用户是否有权限访问该路由
//   if (to.meta.roles && !store.getters.roles.some(role => to.meta.roles.includes(role))) {
//     // 没有权限，跳转到 403 页面
//     next('/403')
//   } else {
//     // 有权限，继续访问该路由
//     next()
//   }
// })
// 前置守卫：在导航被触发时，调用该函数，若函数返回 false 则取消本次导航。
// 后置守卫：在导航被确认时，调用该函数，无论如何都会被调用。
// 全局前置守卫：在导航被触发时，调用该函数，可以对所有路由进行拦截。
// 全局后置守卫：在导航被确认时，调用该函数，可以对所有路由进行处理。
// 路由独享守卫：只对当前路由生效，在导航被触发时，调用该函数，可以对当前路由进行拦截。
// 组件内守卫：只对当前组件生效，在导航被触发时，调用该函数，可以对当前组件进行拦截。


//引入路由器;引入进度条
import router from './router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
//进度条的加载小圆球不要
NProgress.configure({showSpinner: false});

//引入用户相关的仓库
import {useUserStore} from '@/store/modules/user';
//引入大仓库
import pinia from '@/store'

const userStore = useUserStore(pinia);
//存储用户未登录可以访问路由得路径
const whiteList = [
    '/home',
    '/hospital/register',
    '/hospital/detail',
    '/hospital/notice',
    '/hospital/stop',
    '/hospital/search'
];

//添加路由守卫，在入口文件main.js中引入
// 前置守卫
router.beforeEach((to, from, next) => {
    // 访问路由组件之前进度条开始
    NProgress.start()
    //动态设置网页左上角的标题
    document.title = `小医通-${to.meta.title}`;
    //判断用户是否登录-token
    const token = userStore.userInfo.token;
    if (token) {
        next()
    } else {
        // 没有登录,一部分可访问，一部分需要登录
        if (whiteList.includes(to.path)) {
            next()
        } else {
            userStore.dialogFormVisible = false
            next({path: '/home', query: {redirect: to.fullPath}})
        }
    }
    next()
})
// 后置守卫
router.afterEach((to, from) => {
    // 访问路由组件成功进度条结束
    NProgress.done()
})